home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.5)
-
- import wx
- from wx import NewId
- from collections import defaultdict
- from util import Delegate, memoize, funcinfo
- from gui.toolbox import keycodes
- _ids = set()
-
- def MyNewId():
- return None if not len(_ids) else _ids.pop()
-
-
- def ReleaseIds(ids):
- _ids.update(ids)
-
-
- class KeyCatcher(wx.EvtHandler):
-
- def __init__(self, frame):
- frame.Bind(wx.EVT_MENU, self._oncommandevent)
- self.frame = frame
- self.cbs = defaultdict((lambda : Delegate(ignore_exceptions = wx.PyDeadObjectError)))
- self.idcbs = { }
-
-
- def OnDown(self, shortcut, callback):
- sc = str(shortcut)
- accel = keycodes(sc, accel = True)
- self.cbs[accel].insert(0, callback)
- self.update_table()
-
- def rem(accel = accel, callback = callback, shortcut = (sc,)):
- self.cbs[accel].remove(callback)
-
- return rem
-
-
- def update_table(self):
- idcbs = self.idcbs
- ReleaseIds(idcbs.keys())
- idcbs.clear()
- entries = []
- for modifiers, key in self.cbs.iteritems():
- callback = None
- wxid = MyNewId()
- idcbs[wxid] = callback
- entries.append((modifiers, key, wxid))
-
- atable = wx.AcceleratorTableFromSequence(entries)
- if not atable.IsOk():
- print 'warning: accelerator table is not OK'
-
- self.frame.SetAcceleratorTable(atable)
-
-
- def _oncommandevent(self, e):
-
- try:
- cbs = self.idcbs[e.Id]
- except KeyError:
- e.Skip()
-
- cbs(e)
- e.Skip()
-
-
-